package com.young.ums.service.impl;

import com.young.common.client.ums.UmsClientHelper;
import com.young.common.exception.BaseException;
import com.young.common.util.StringUtils;
import com.young.ums.model.AuthorityParameter;
import com.young.ums.model.User;
import com.young.ums.model.Dept;
import com.young.ums.model.Role;
import com.young.ums.service.IDataAuthService;
import com.young.ums.service.IDeptService;
import com.young.ums.service.IRoleUserService;
import com.young.ums.service.IUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 数据权限服务实现
 * @author imrookie
 * @date 2018/10/22
 */
@Service("dataAuthService")
public class DataAuthServiceImpl implements IDataAuthService {

    private static Logger logger = LoggerFactory.getLogger(DataAuthServiceImpl.class);

    @Resource(name="roleUserService")
    IRoleUserService roleUserService;

    @Resource(name="userService")
    IUserService userService;

    @Resource(name="deptService")
    IDeptService deptService;

    /**
     * 处理权限参数,会根据登录用户id设置管理范围
     * (推荐service层使用)
     *
     * @param authorityParameter 待处理权限参数对象
     */
    @Override
    public void handleAuthorityParameter(AuthorityParameter authorityParameter) {
        //若开启权限控制,则对权限做相关处理
        if (authorityParameter.enableAuth()){
            //当前登录用户id
            String loginUserId = authorityParameter.getLoginUserId();
            //查询管理范围
            List<Dept> rangeList = this.getManageRangeOrg(loginUserId);
            if (rangeList != null && rangeList.size() > 0){
                //设置管理范围
                authorityParameter.setManageRangeList(rangeList);
            }

        }
    }

    /**
     * 查询用户管理范围的机构节点（可能是单位，也可能是部门，或者是其他）
     * 用户能够管理哪个机构节点内的数据
     * 1.首先取用户管理类型角色的管理范围
     * 2.若第一步没有取到机构信息,则默认使用用户所属单位作为管理范围
     *
     * @param userId 用户id
     * @return
     */
    @Override
    public List<Dept> getManageRangeOrg(String userId) {
        if (StringUtils.isBlank(userId)){
            logger.error("[数据权限-查询管理节点] 用户编号为空");
            throw new BaseException("用户编号为空");
        }
        List<Dept> resList = null;
        //1.查询用户关联的管理型角色
        List<Role> roleList = roleUserService.getAdminRoleListByUserId(userId);
        //存在管理类型角色,选出最大管理范围(一条链上的节点以最大的算,不同链的节点共存)
        if (roleList != null && roleList.size() > 0){
            List<String> deptIds = new ArrayList<String>();
            for (Role role : roleList){
                if (StringUtils.isNotBlank(role.getRangeId())){
                    deptIds.add(role.getRangeId());
                }
            }
            if (deptIds.size() > 0){
                //根据角色范围id查询机构信息列表
                resList = deptService.getListByIds(deptIds.toArray(new String[]{}));
            }
        }

        //2.查询用户所属单位
        if (resList == null || roleList.size() == 0){
            User user = userService.get(userId);//当前用户信息
            if (user == null){
                logger.error("[数据权限-查询管理节点] 用户[{}]查询为空", userId);
                throw new BaseException("用户不存在");
            }
            Dept company = deptService.get(user.getCompanyId());//用户所属单位
            if (company == null){
                logger.error("[数据权限-查询管理节点] 用户[{}]所属单位[{}]查询为空", userId, user.getCompanyId());
                throw new BaseException("用户所属单位不存在");
            }
            resList = new ArrayList<Dept>(1);
            resList.add(company);
        }
        logger.info("[数据权限-查询管理节点] 用户[{}]管理范围为:{}", userId, resList);
        return resList;
    }

    /**
     * 查询用户管理范围的单位节点（type=COMPANY）
     * 用户能够管理哪个单位的数据
     *
     * @param userId 用户id
     * @return
     */
    @Override
    public List<Dept> getManageRangeCompany(String userId) {
        return null;
    }

    /**
     * 查询用户管理范围的部门节点（type=DEPT）
     * 用户能够管理哪些部门的数据
     *
     * @param userId 用户id
     * @return
     */
    @Override
    public List<Dept> getManageRangeDept(String userId) {
        return null;
    }
}
